package cn.leida.ruoyi.common.utils.ip;

import jakarta.servlet.http.HttpServletRequest;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class LocalIPUtil {
    public static String localIP() {
        try {
            InetAddress addr = InetAddress.getLocalHost();
            // 获取主机名对应的所有IP地址，然后选择第一个非回环的IPv4地址作为局域网IP地址
            byte[] address = addr.getAddress();
            // IPv4地址长度为4字节
            if (address.length == 4) {
                return addr.getHostAddress();
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static String buildFullUrl(HttpServletRequest request, boolean localIP) {
        // 获取协议，如http或https
        String scheme = request.getScheme();
        // 获取服务器名
        String serverName = request.getServerName();
        if (localIP) {
            serverName = LocalIPUtil.localIP();
        }
        // 获取服务器端口号（如果不是80或443，则需要显示）
        int serverPort = request.getServerPort();
        // 获取应用上下文路径，例如 /myapp
        String contextPath = request.getContextPath();
        // 获取当前Servlet的路径部分，例如 /path/to/servlet
        String servletPath = request.getServletPath();
        // 获取查询参数部分，例如 key1=value1&key2=value2
        String queryString = request.getQueryString();

        StringBuilder url = new StringBuilder(scheme).append("://").append(serverName);
        // 除非是标准的HTTP端口80或HTTPS端口443，否则显示端口号
        if (serverPort != 80 && serverPort != 443) {
            url.append(":").append(serverPort);
        }
        // 添加应用上下文和Servlet路径
        url.append(contextPath).append(servletPath);
        // 添加查询参数（如果有）
        if (queryString != null) {
            url.append("?").append(queryString);
        }
        // 返回完整的URL字符串
        return url.toString();
    }

    /**
     *
     * @param request
     * @param localIP
     * @return
     */
    public static String buildUrl(HttpServletRequest request, boolean localIP) {
        // 获取协议，如http或https
        String scheme = request.getScheme();
        // 获取服务器名
        String serverName = request.getServerName();
        if (localIP) {
            serverName = LocalIPUtil.localIP();
        }
        // 获取服务器端口号（如果不是80或443，则需要显示）
        int serverPort = request.getServerPort();
        // 获取应用上下文路径，例如 /myapp
        String contextPath = request.getContextPath();

        StringBuilder url = new StringBuilder(scheme).append("://").append(serverName);
        // 除非是标准的HTTP端口80或HTTPS端口443，否则显示端口号
        if (serverPort != 80 && serverPort != 443) {
            url.append(":").append(serverPort);
        }
        // 添加应用上下文
        url.append(contextPath);
        return url.toString();
    }
}